Description

The calculator can be used to solve for the hazard rate (or survival probability) for each subgroup in prognostic marker study where the overall combined or overall survival probability, the marker frequency, and the hazard ratio between the prognostic groups are specified.

The Model is:

Surv(t) = mark.prob * exp(-t * haz.markpos) + (1 - mark.prob * exp(-t * haz.markneg / HR))

Therefore, this function assumes that the outcome distribution in each of the prognostic groups is exponentially distributed and that the overall survival distribution is a mixture of the those two subpopulation models.

Input Items

Output Items

Statistical Code

The program is written in R. The nonlinear solver used to calculate subgroup survival functions is R base uniroot().

View Code


function(Surv_average = .5, mark_fract = .5, HR = 2, at_time = 1, at_time_output = 1) {
    # function to solve for hazards in prognostic marker study with fixed overall survival and assuming exponential sub-populations
    
    # this function assumes that the outcome distribution in each of the prognostic groups is exponetially distributed
    # and that the overall survival distribution is a mixture of the those two subpopulation models.
    #
    #   Surv(t) = marker.frac*exp(-t*hazard.rate1)+(1-marker.frac*exp(-t*hazard.rate1/HR))
    #
    # Surv_average - overall survival at at_time
    # at_time - time point the overall average survival is given
    # mark_fract -  the fraction of patients that are marker positive
    # HR - the hazard ratio between marker postive and marker negative patients
    # OUTPUT
    # hazard.rate1 - hazard rate for marker positive patients
    # hazard.rate2 - hazard rate for marker negative patients
    # at_time_output - the time for the output for survival for marker postive and marker negative patient  
    
    # Note in the root solve it only finds hazard rates as high as 100
    #---------------------------------------------------------------------------------
    
    ff=function(x, tt = at_time, hazard.ratio = HR, s.average = Surv_average, frac = mark_fract) {
        y = s.average - (frac * exp(-x * tt) + (1 - frac) * exp(-x * tt / hazard.ratio))
        y
    }
    
    aa = uniroot(ff, lower = 0, upper = 100, tol = 1e-9)$root     # solves for the hazard rate in marker + group
    
    tolerance = Surv_average - (mark_fract * exp(-aa * at_time) + (1 - mark_fract) * exp(-aa * at_time / HR))
    hazard.rate1 = aa
    hazard.rate2 = aa / HR
    surv1 = exp(-at_time_output * hazard.rate1)
    surv2 = exp(-at_time_output * hazard.rate2)
    result = list(mark_fract = mark_fract,
                  Surv_average = Surv_average,
                  at_time = at_time,
                  hazard_rate1 = hazard.rate1,
                  hazard_rate2 = hazard.rate2,
                  survival1 = surv1,
                  survival2 = surv2,
                  at_time_output = at_time_output,
                  survivaltarget_difference = tolerance)
    return(jsonlite::toJSON(result, pretty = TRUE))
}